php7中怎么对异常与错误进行处理

您所在的位置:网站首页 loader error什么意思 php7中怎么对异常与错误进行处理

php7中怎么对异常与错误进行处理

2023-04-15 16:53| 来源: 网络整理| 查看: 265

 当前位置:首页 » 编程设计 » 正文 php7中怎么对异常与错误进行处理 2023年04月13日5langtianya 什么叫做异常?

异常是指程序运行中不符合预期情况以及与正常流程不同的状况。

比如你链接数据库,在参数都写上去的条件下,发现链接不上去,这就属于不符合预期

可以被 try-catch 捕捉得到

什么叫做错误?

是属于php程序自身的问题,一般是由非法的语法,环境问题导致的,使得编译器无法通过检查,甚至无法运行的情况。 平时遇到的 warming、notice都是错误,只是级别不同而已。

例如:

TypeError(类型错误) 我规定的函数参数类型和传入的参数不一致

ArithmeticError (算数错误)

ParseError (解析错误)在调入的文件中,include "demo.php",或者 eval();中有语法错误造成解析失败

AssertionError(断言错误)当assert生效时产生该错误

DivisionByZeroError (分母为零) 运算过程中例如除法,分母为0

除了这几种情况,其余全部为异常

异常处理

在以前的 php5.X 中 并且不能被 try-catch 捕捉得到,到了 php 7.x 中,定义了一个 Throwable 接口 并使得大部分的 Error 和 Exception 实现了该接口,我们得以在 try-catch 中抛出该错误

所以说以后想要捕获异常,而你又不知道此异常是 Error 还是 Exception 的话,可以向这样抛出

try{     …… }catch(Throwable $e){     …… } 错误的级别

在 php 中的错误也是有级别的

Parse error >Fatal Error > Waning > Notice > Deprecated

Deprecated 最低级别的错误(不推荐,不建议) 使用一些过期函数的时候会出现,程序继续执行 Notice 通知级别的错误 使用一些未定义变量、常量或者数组key没有加引号的时候会出现,程序继续执行         E_NOTICE      // 运行时通知。表示脚本遇到可能会表现为错误的情况.         E_USER_NOTICE // 用户产生的通知信息。          Waning 警告级别的错误 程序出问题了,需要修改代码!!!程序继续执行         E_WARNING         // 运行时警告 (非致命错误)。         E_CORE_WARNING    // PHP初始化启动过程中发生的警告 (非致命错误) 。         E_COMPILE_WARNING // 编译警告         E_USER_WARNING    // 用户产生的警告信息          Fatal Error 错误级别的错误 程序直接报错,需要修改代码!!!中断程序执行,可使用register_shutdown_function()函数在程序终止前触发一个函数         E_ERROR         // 致命的运行错误,错误无法恢复,暂停执行脚本         E_CORE_ERROR    // PHP启动时初始化过程中的致命错误         E_COMPILE_ERROR // 编译时致命性错,就像由Zend脚本引擎生成了一个E_ERROR         E_USER_ERROR    // 自定义错误消息。像用PHP函数trigger_error(错误类型设置为:E_USER_ERROR)          Parse error 语法解析错误 语法检查阶段报错,需要修改代码!!!中断程序执行,除了修改ini文件,将错误信息写到日志中,什么也做不了         E_PARSE  //编译时的语法解析错误 自定义错误处理程序

有的时候,php 中自带的错误处理程序,并不能完全满足我们得需要,大部分时候,我们都需要手动重写异常处理。

php 给我们提供了三个函数来帮助我们来处理,分别是

set_error_handler()

函数来托管错误处理程序,可自行定制错误的处理流程。

如果此函数之前的代码发生错误,那么不会调用我们自定义的处理函数,因为还未注册

设置此函数后 error_reporting() 将会失效

以下级别的错误不能由用户定义的函数来处理: E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING 该函数只能捕捉我们的 部分 Warning 和 Note 级别的错误

set_exception_handler()

用于没有被捕获的异常处理

register_shutdown_function()

作用:注册一个会在php中止时执行的函数

捕获PHP的错误:Fatal Error、Parse Error等,这个方法是PHP脚本执行结束前最后一个调用的函数,比如脚本错误、die()、exit、异常、正常结束都会调用,

如果拿来用错误处理的时候,需要配合error_get_last() 它能获取最后发生的错误。

// 举例: register_shutdown_function('shutdown'); function shutdown() {     if ($error = error_get_last()) {         var_dump($error);     } } $name   //没写 ; 号

执行结果 Parse error: syntax error, unexpected ';' in /app/swoole/errorDemo.php on line 34 Emmmmm 这不扯淡吗? 分明分明没有执行呢?

其实原因使因为,程序执行前,我们 php 会先检查我们程序的语法问题,如果没有问题,我们才能执行我们的程序。

我们上面的代码没用通过我们的语法检查,所以直接报错。

那么问题来了? 我们在框架中的时候,为什么是框架都是框架给我们报错呢?

框架的错误处理

在框架中,其代码是通过一个入口文件来加载的。而我们php检测语法错误的时候,只检查我们的 index.php 有没有错误, require 文件中的代码是不会受到检测的。在Index.php 文件中通常会定义一些错误异常的处理。当我们代码出错时,那是在 run-time 中检测的错误,我们的框架可以根据我们编写的错误异常自行做出处理。

下面我们举个例子 在 ThinkPHP5中的异常处理

// [ 应用入口文件 ]  index.php namespace think; // 加载基础文件 require __DIR__ . '/../thinkphp/base.php'; // 支持事先使用静态方法设置Request对象和Config对象 // 执行应用并响应 Container::get('app')->run()->send();

在我们的入口文件中,加载了 base.php 在这个文件中,TP 定义了自己的异常处理

// 载入Loader类 require __DIR__ . '/library/think/Loader.php'; // 注册自动加载 Loader::register(); // 注册错误和异常处理机制 Error::register(); // 实现日志接口 if (interface_exists('Psr\Log\LoggerInterface')) {    //doSomething } // 注册类库别名 Loader::addClassAlias([    //doSomething ]); /**      * 注册异常处理      * @access public      * @return void      */     public static function register()     {         error_reporting(E_ALL);         set_error_handler([__CLASS__, 'appError']);         set_exception_handler([__CLASS__, 'appException']);         register_shutdown_function([__CLASS__, 'appShutdown']);     } 本文参考链接:https://www.yisu.com/zixun/541338.html

上一篇: html - html中不同的文档类型是什么,它们是什么意思

下一篇: php中strftime乱码的解决方法

PHP   文章来源:ITGUEST,欢迎分享,转载请保留出处  原文地址:https://www.itguest.com/post/cdeic2b3.html 阅读延展 linux下php无法取到session怎么办php如何将word转换为html格式PHP如何判断IP并转跳到相应城市分站jquery与php结合如何实现AJAX长轮询PHP中正则表达式效率 贪婪、非贪婪与回溯的示例分析PHP中如何实现类的自动加载PHP中的单例模式和工厂模式分别是什么php如何将数组里所有元素转成字符串php中getimagesize怎么用PHP PDO预处理语句及事务的示例分析怎么解决php请求丢失问题PHP的比较运算与逻辑运算实例讲解


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3